package cn.gxa.j229.bug.finance.controller;

import cn.gxa.j229.bug.finance.BusinessException;
import cn.gxa.j229.bug.finance.utils.JsonResult;
import com.alibaba.druid.wall.violation.ErrorCode;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author FanJiang
 * @Date 2020/9/17
 * @Version 1.0
 */


@ControllerAdvice   //将当前类作为全局异常的总处理入口
@ResponseBody
@Log4j2

public class ExceptionController {


//    将异常记录在控制台
//    @ExceptionHandler({Exception.class})
//    public void handleException(Exception e){
//        //系统异常：记录日志
//        System.out.println("--------------------------------");
//        System.out.println("异常发生的原因是：" + e.getMessage());
//        System.out.println("异常的类型是：" + e.toString());
//        e.printStackTrace();
//
//        //如果要把异常在栈中的错误信息获取并输出到文件
//        StackTraceElement[] stackTrace = e.getStackTrace();
//        for (StackTraceElement stackTraceElement : stackTrace) {
//            System.out.println(stackTraceElement.toString());
//        }
//        System.out.println("--------------------------------");
//
//
//    }


//    将异常记录到日志文件
    @ExceptionHandler(Throwable.class)
    public Map advice(Exception throwable){
        Map<String,Object> responseMap = new HashMap<>();
        if(throwable instanceof BusinessException){
//            ErrorCode errorCode = ((BusinessException)throwable).getErrCode();
            responseMap.put("code",((BusinessException)throwable).getErrCode());
            responseMap.put("msg",((BusinessException)throwable).getErrMessage());
        }else{
            //        把异常信息记录在日志文件中:
            //        在没有lombok的情况下, 要想使用log4j2必须通过LogFactory
            //        Log log = LogFactory.getLog("");

            // 使用@Log4j2注解后, 可以直接调用log对象了
            log.info("-----------------begin-----------------------"); //分割线方便阅读
            log.info(throwable);  // 先记录异常对象的toString状态: 包括异常类型和异常原因

            // 再遍历栈中的异常轨迹: 采用遍历方式
            StackTraceElement[] stackTrace = throwable.getStackTrace();
            for (StackTraceElement stackTraceElement : stackTrace) {
                log.info(stackTraceElement);
            }
            log.info("-------------------end---------------------");//分割线方便阅读

            responseMap.put("code",505);
            responseMap.put("msg","系统开小差了,请稍后再试");
        }
        return responseMap;
    }


    /*@ExceptionHandler(BusinessException.class)
    public Map handleBusinessException(BusinessException e){

        //如果业务异常，则返回给前端
        JsonResult jsonResult = new JsonResult();
        jsonResult.setCode("500");
        jsonResult.setMsg(e.getMessage());

        return jsonResult.getValues();

    }*/

}
